Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: Forward   发起时间: 2011-06-22 16:41 下午   回复: 10

Print Search
帖子排序:    
   2011-06-22, 16:41 下午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Confused [*-)] 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

大家好:

      我在调试软件的时候发现一个奇怪的现象。软件在运行一段时间后,会中断到windbg调试器中,但是g之后,继续运行完全正常。我能分析出问题出现的直接原因,但是根本原因是什么呢??谁能帮我解释下这个现象?这个问题严重么?如果不对它进行处理那么当软件发布的时候会不会出现问题呢?

      下面是我的分析:

      经过观察发现问题出现在wdmaud模块中,感觉和录放音相关,再看下调用栈RtlGetUserInfoHeap函数的2个参数中,00140000没有问题,但是00161700却似乎存在问题,因为这个堆块的基地址是001616e8,加上8B的HEAP_ENTRY,那么用户起始地址应该是001516f0。而这里确实00161700,之后再用RtlpValidateHeapEntry去验证堆块,那肯定会出问题。

   我的调试过程:

  首先在调试软件时,我开启了htc hfc hpc hvc.

0:005> !gflag
Current NtGlobalFlag contents: 0x000000f0
    htc - Enable heap tail checking
    hfc - Enable heap free checking
    hpc - Enable heap parameter checking
    hvc - Enable heap validation on call

   在软件运行一段时间后,出现如下提示

      HEAP[SPlane.exe]: Invalid Address specified to RtlGetUserInfoHeap( 00140000, 00161700 )
(8a8.14f4): Break instruction exception - code 80000003 (first chance)
eax=001616f8 ebx=001616f8 ecx=7c93d4fd edx=0152fc69 esi=00140000 edi=00161700
eip=7c92120e esp=0152fe6c ebp=0152fe70 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:

   调用栈是这样的:

   0:005> kv
ChildEBP RetAddr  Args to Child             
0152fe68 7c98ee31 0152fe84 7c98f26e 001616f8 ntdll!DbgBreakPoint (FPO: [0,0,0])
0152fe70 7c98f26e 001616f8 00140000 00000001 ntdll!RtlpBreakPointHeap+0x28 (FPO: [Non-Fpo])
0152fe84 7c990715 00140000 001616f8 7c9907d4 ntdll!RtlpValidateHeapEntry+0x113 (FPO: [Non-Fpo])
0152fed4 7c96d381 00140000 50000061 00161700 ntdll!RtlDebugGetUserInfoHeap+0x96 (FPO: [Non-Fpo])
0152ff38 7c834d23 00140000 00000001 00161700 ntdll!RtlGetUserInfoHeap+0x3a (FPO: [Non-Fpo])
0152ff84 72c922ce 00161700 7c9210e0 7c921000 kernel32!GlobalHandle+0x3a (FPO: [Non-Fpo])
0152ff9c 72c94617 00160a20 00000004 003dea00 wdmaud!waveCompleteHeader+0x40 (FPO: [Non-Fpo])
0152ffb4 7c80b729 00000638 00000004 003dea00 wdmaud!waveThread+0x9c (FPO: [Non-Fpo])
0152ffec 00000000 72c9457b 00160a20 00000000 kernel32!BaseThreadStart+0x37 (FPO: [Non-Fpo])

观察堆头是有效的,但在程序中以001616f8去验证堆头,肯定会报错。

0:005> dt ntdll!_HEAP_ENTRY 001616e8
   +0x000 Size             : 0x14
   +0x002 PreviousSize     : 0x26
   +0x000 SubSegmentCode   : 0x00260014 Void
   +0x004 SmallTagIndex    : 0x89 ''
   +0x005 Flags            : 0x7 ''
   +0x006 UnusedBytes      : 0x1c ''
   +0x007 SegmentIndex     : 0 ''

观察下出问题的堆块是这样的:

0:005> db 001616e8 la0
001616e8  14 00 26 00 89 07 1c 00-f8 f2 4a 5f 98 fe dc 00  ..&.......J_....
001616f8  00 00 00 00 58 00 00 00-00 00 00 00 00 08 53 01  ....X.........S.
00161708  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00161718  5e 99 42 5f 00 00 00 00-b4 f0 4a 5f 00 00 00 00  ^.B_......J_....
00161728  11 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00161738  0a 00 00 00 b4 f0 4a 5f-00 00 00 00 11 00 00 00  ......J_........
00161748  00 00 00 00 00 00 00 00-00 00 00 00 0a 00 00 00  ................
00161758  50 f0 4a 5f 00 00 00 00-00 00 00 00 00 00 00 00  P.J_............
00161768  00 00 00 00 00 00 00 00-0a 00 00 00 ab ab ab ab  ................
00161778  ab ab ab ab ee fe ee fe-00 00 00 00 00 00 00 00


IP 地址: 已记录   报告
   2011-06-22, 23:04 下午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

自己顶下,大家帮帮忙啊


IP 地址: 已记录   报告
   2011-06-23, 11:21 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote
产生个DUMP(.dump /mfh xx.dmp),压缩一下发上来
IP 地址: 已记录   报告
   2011-06-23, 17:17 下午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

张老师,由于dump压缩后也有11M之大,不能够传到这里,因此我将它保存到了邮箱wbdwbd004@163.com中,麻烦从那里下载下了。


IP 地址: 已记录   报告
   2011-06-23, 19:41 下午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

晕,下午忘记说密码了,邮箱的密码是110801。


IP 地址: 已记录   报告
   2011-06-24, 11:26 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote
下载好了,其它想下载的,尽快,然后建议楼主修改密码,以防有“围脖”局长用这个信箱聊天,呵呵:-)
IP 地址: 已记录   报告
   2011-06-24, 20:49 下午
Thomson 离线,最后访问时间: 2013/3/31 11:42:42 Thomson

发帖数前10位
注册: 2008-07-03
发 贴: 211
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote
你贴的output是用的你上传的dump吗? 我发现dump里面正在检查的HEAP_ENTRY是下面的。

0:005> dd 0x001608f8
001608f8 00000000 00000000 00040013 0018074d
00160908 00080020 00000000 00080062 00080043
00160918 00080044 00080045 00000000 00080047
00160928 00000000 00000000 00000000 0008006b
00160938 0010ff0c 0008002d 00000000 0008004f
00160948 00080030 00080031 00080032 00080033
00160958 00080034 00080035 00080036 00080037
00160968 00080038 00080039 0008003a 00000000
IP 地址: 已记录   报告
   2011-06-24, 23:26 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote
确实不是一个实例。初步看了一下,还是比较严重的问题,属于“使用已经释放了堆块”,这个问题容易复现么?
BTW,这是个很著名的问题,Stackoverflow上曾经讨论过的http://stackoverflow.com/questions/195696/why-would-waveoutwrite-cause-an-exception-in-the-debug-heap

IP 地址: 已记录   报告
   2011-06-25, 00:30 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

是不是一个实例,邮箱中的dump是后来截取的。这个问题,现在出现的次数明显比以前少了。昨天抓了一天,才抓住我上传的那个。今天就没有出现过。


IP 地址: 已记录   报告
   2011-06-26, 10:04 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote
可以使用Application Verifier试一下
IP 地址: 已记录   报告
   2011-06-28, 11:39 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??
Reply Quote

恩,这2天都没有出现这个问题了。。。

Application Verifier也没有报错


IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » 一个奇怪的堆错误,请大家帮我解释下这个现象的根本原因是什么??

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.